home *** CD-ROM | disk | FTP | other *** search
- ┌──────────────────────────────────────────────────────────────────────────┐
- │┌────────────────────────────────────────────────────────────────────────┐│
- ││ ││
- ││ Bir Derleyici Yazmak ÿster misiniz? ││
- ││ ││
- │└────────────────────────────────────────────────────────────────────────┘│
- │ PS 31 · ₧ubat'96 Tunç Sabuncu │
- └──────────────────────────────────────────────────────────────────────────┘
-
-
- Programlarìnìzì yazmak için kullandìºìnìz derleyicilerin nasìl çalìƒtìºìnì
- hiç merak ettiniz mi ? PASCAL ya da PROLOG gibi bir dilde yazìlmìƒ kaynak
- kodu okuyan hatta anlayan ve orada tanìmlanan süreçleri PC'nizin
- anlayabileceºi tek dil olan makina diline çeviren bu programlarìn yazìlmasì
- gerçekten çok zor ve uzun bir uºraƒtìr. Bu nedenle kimse kendi baƒìna
- derleyici yazmaya kalkìƒmaz. Yazìlìmevleri ekipler kurup deneyimli
- programcìlar arasìnda iƒbölümü yaparlar. Tasarìm ve kodlama ile geçen uzun
- bir dönemden sonra daha uzun bir zaman denemeler için ayrìlìr. Çünkü kimse
- "bazì PASCAL programlarìnì derleyen" bir programa para ödemez. Eh artìk
- herhalde tek baƒìnìza derleyici yazmaya kalkìƒmazsìnìz! ₧aka bir yana, sonucu
- ne olursa olsun her uºraƒ ( derleyici yazmaya çalìƒmak dahil ) size birƒeyler
- kazandìrìr. Ama gelin biz biraz akademik takìlalìm.
-
- Bir süredir burada 'ÿnce ÿƒler" baƒlìºì ile tanìtmaya çalìƒtìºìmìz veri
- yapìlarì size derleyici ve yorumlayìcì ( kaynak kodu bellekte çalìƒtìran,
- EXE oluƒturmayan programlar. sözgelimi GWBASIC ) yazmanìn kapìlarìnì
- açacak altìn bir anahtar. Aslìnda Programlama Sanatì'nìn önceki sayìlarìnda
- da bu konulara deºindik. "Pascal'da baºlì listeler" baƒlìºì ile verilen
- programlar veri yapìlarìnìn alt baƒlìklarìndan. Özetle yìºìt, kuyruk, baºlì
- listeler ve aºaçlarì bilmeden derleyici yazmaya çalìƒmak biraz körebe
- oynamaya benziyor.
-
- Laf-ì güzafì bir yana bìrakalìm ve konuya yeni ìsìnan okuyucularìmìz için
- derleyicilerin gerçekte ne yaptìklarìnì kìsaca anlatalìm. Siz programcì
- olarak PC'niz için hiçbir anlamì olmayan 'print' ya da 'a:=b+c' gibi
- laflarì yazìp ondan birƒeyler beklersiniz. ÿƒte derleyiciler bu ASCII
- yìºìnìnì bazen satìr numaralarìnì ( BASIC ) bazen ';' gibi iƒaretleri
- ( PASCAL ) bazen de '(' gibi ayraçlarì ( LISP ) kullanarak parçalarlar.
- Buraya kadar basit. Fakat bundan sonra deºiƒik algoritmalarla kurulmuƒ
- çözümleyicileri ( parser ) kullanarak sizin pascalca anlattìºìnìz
- iƒleri ( dìƒarìdan bir sayì al, ikiyle çarp, ekrana yaz vb. ) bellekte
- simgelerler. ÿƒte veri yapìlarì bu noktada devreye girer. Sözgelimi
- a=b+c gibi bir ifade,
-
- a
- / \
- = +
- / \
- b c
-
- böyle bir aºaçta simgelenir. Bu aºaçlara da çözümleme aºaçlarì denir.
- ( Çözümleyicilere ve aºaçlara gelecek sayìlarda deºineceºiz. )
- Çözümleyici birim, üzerine düƒeni yaptìktan sonra sìra deºerlendirme ve
- kod üretme modülüne gelir. Bu aºaç için üretilecek ASSEMBLY kodu ise
-
- mov AX,WORD PTR b
- add AX,WORD PTR c
- mov WORD PTR a,AX
-
- olacaktìr. Daha önceki yazìlarìmìzdan tanìdìºìnìz yìºìt veri tipi
- matematiksel ifadelerin hem deºerlendirilmesinde hem de ASSEMBLY'ye
- çevirilmesinde kullanìlìr.
-
- Postfix ve Prefix
-
- Bizim günlük yaƒamìmìzda ve PASCAL, C gibi dillerde kullandìºìmìz
- sìralama alternatifsiz deºildir. Matematiksel iƒaretlerin deºiƒken
- grubunun önüne ya da ardìna sìralanmasì da olasìdìr. Bu iki seçenekle
- birlikte geleneksel yaklaƒìm aƒaºìdaki tabloda verilmiƒtir.
-
- infix postfix prefix
-
- A+B AB+ +AB
- A+B-C AB+C- -+ABC
- (A+B)*(C-D) AB+CD-* *+AB-CD
- A^B*C-D+E/F/(G+H) AB^C*D-EF/GH+/+ +-*^ABCD//EF+GH
- ((A+B)*C-(D-E))^(F+G) AB+C*DE--FG+^ ^-+ABC-DE+FG
- A-B/(C*D^E) ABCDE^*/- -A/B*C^DE
-
- Bu ay ki kodumuzun temelini oluƒturan postfix'i gözönüne alacak olursak,
- deºerlendirme süreci ƒöyle iƒler: Bir matematiksel iƒarete gelene dek
- deºiƒkenler ( ya da sayìlar ) sìrasìyla PUSH edilir ( yìºìta konur ) .
- Bir iƒarete gelindiºinde PUSH edilmiƒ olanlar POP edilerek ( yìºìttan
- alìnarak ) iƒlem, üzerlerinde uygulanìr. Örneºin tablodaki ilk satìrda
- A ve B önce push edilir, '+' iƒareti gelince pop edilerek toplanìr.
- ( Diºer satìrlar için sayìlar vererek kendinizi deneyebilirsiniz. )
-
- ₧imdi gelelim derleyici yazma kìsmìna!
-
- Öyle bir program yazalìm ki postfix gösterimde girdiºimiz matemetiksel
- ifadelere karƒìlìk gelen ASSEMBLY kodunu yazsìn. Biz konunun daha iyi
- anlaƒìlmasì için basit bir ASSEMBLY tanìmladìk. Altì tane komut var:
- ADD, SUB, MUL, DIV, MOV, PUT. Assembly'miz veri aktarìmì için geçici bir
- deºiƒkene gerek duyarsa TEMP_1, TEMP_2 gibi kaynak koda dahil edebiliyor.
- Bu iƒ için PUT, tek yazmaçìna ( register ) atama yapmak içinse MOV.
-
- Örneºin 'ab+' postfix ifadesi için ƒu kod üretiliyor:
- MOV a
- ADD b
- PUT TEMP_1
-
- Eºer 'ab+c*de--fg+' ifadesi girilecek olursa sonuç biraz daha uzun:
- MOV a
- ADD b
- PUT TEMP_1
- MOV TEMP_1
- MUL c
- PUT TEMP_2
- MOV d
- SUB e
- PUT TEMP_3
- MOV TEMP_2
- SUB TEMP_3
- MOV f
- ADD g
- PUT TEMP_5
-
- Artìk bir derleyicinin çalìƒma ƒekli hakkìnda hiç de azìmsanmayacak bir
- bilgi sahibi oldunuz. Kaynak kod dìƒìnda hiçbir eksiºiniz kalmadì.
- Haydi davranìn tuƒlara...
-
-